package BehavioralPattern.Observer.jdk;

import java.util.Observer;

/**
 * @Classname : ObserverClient
 * @Description : 测试 观察者模式（jdk）
 * 行为型——观察者模式
 * 一、模式定义
 *   Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.
 *   定义对象间一种一对多的依赖关系，使得每当一个对象改变状态，则所有依赖于它的对象都会得到通知并被自动更新。
 *   优点：
 *     容易扩展
 *   缺点：
 *     由于通知默认顺序执行，当观察者多时一是执行效率低，二是若其中一个观察者出现异常会影响其他观察者，可考虑采用异步形式。
 *     多级触发时会导致系统复杂度增加，开发调试困难，建议不要超过两级触发。
 *   注意：
 *     被观察者通知观察者的update方法一般有两个入参，一个是被观察者，另一个是DTO (Data Transfer Object, 数据传输对象)
 *     被观察者可通过标识决定当前状态改变是否通知观察者，如jdk实现中的setChanged方法
 * 二、模式类图
 *    https://kdocs.cn/l/caNm7Bs4j5B6
 * 三、适用场景
 *   1、当需要实现一套触发机制时（如发布/订阅场景）
 * 四、应用举例
 *   1、消息队列
 * @Author : chentianyu
 * @Date 2023/3/4 23:42
 */


public class ObserverClient {
    public static void main(String[] args) {
        System.out.println("—————————观察者模式（jdk）————————");
        // 创建观察者
        Observer ZhangSan = new ConcreteObserver("张三");
        Observer LiSi = new ConcreteObserver("李四");
        // 创建被观察者 （注意只能使用具体被观察者）
        ConcreteSubject subject = new ConcreteSubject("天气预报");
        // 观察者订阅被观察者
        subject.addObserver(ZhangSan);
        subject.addObserver(LiSi);
        // 被观察者执行具体业务并通知观察者
        subject.operate();
    }
}

/** 20230304
 * —————————观察者模式（jdk）————————
 * 电台：各位听众朋友好，欢迎收听今天的广播节目——天气预报！
 * 李四：搬起小板凳开始收听今天的广播节目——天气预报
 * 张三：搬起小板凳开始收听今天的广播节目——天气预报
 */
